/**
 *编译代码
 *cmdstring 编译命令
 *编译超时返回0其他返回1
*/
int startcompile(const char *cmdstring)
{  
	  pid_t pid;//用于创建编译进程
	  int flag=0;//标记编译结果
        int status=1;
        FILE *out;//用于重定向编译输出
  
        if(cmdstring==NULL)
        	return(1);
        if((pid=vfork())<0)
       {
       	 status=-1;
       }
        else if(pid==0)
        {
		struct rlimit limit;//用于设置编译时间限制
		getrlimit(RLIMIT_CPU,&limit);
          	limit.rlim_cur=5;//编译超过5秒则超时
          	setrlimit(RLIMIT_CPU,&limit);
          	/*进程时间限制为TLs*/      
	      out=freopen(thein.gccttemp,"w",stderr);//重定向标准错误到thein.gcctemp
 	      if(strcmp(theout.la,"java")!=0){//如果语言不为java	    
            execlp(thein.cmdgcc,
			"-ansi",//关闭gnuc中与ansic不兼容的特性,激活ansic的专有特性(禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏)
			"-fno-asm",//此选项实现ansi选项的功能的一部分，它禁止将asm,inline和typeof用作关键字。
			"-O2",//进一步优化。
			"-w",
			"-lm",//数学函数库
			"--static",//禁止使用共享连接
		      "-DONLINE_JUDGE",
			"-o",
			thein.outproname,thein.path,NULL);//将代码编译为theinout.proname可执行文件
		
 		}
           else{
                 char temppath[100];
                 strcpy(temppath,path);
                 strcat(temppath,PUBT);		
                  execlp("javac","-nowarn","-d",temppath,thein.path,NULL);//将代码编译为PUBT/主类名.class
                    
                   }
            fclose(out);  
        } 
        else
       {		
                 	wait(&status);                //等待编译结束
                 	if(WIFEXITED(status))
			{
                 	  flag=1;/*进程正常停止*/ 
                 	}
                	else if(WIFSIGNALED(status))
			{
	                      int sig = WTERMSIG(status);//异常结束
	                      if(sig == SIGXCPU)//如果为超时结束
			     {         
                                      
                        	flag=0;/*超时*/
                             }
                        
              	   
                      }
       }      
     return(flag);
}
